package net.yeah.mickey_zhouyou.database;

import java.util.ArrayList;
import java.util.Collection;

import net.yeah.mickey_zhouyou.database.cache.EntityCache;
import net.yeah.mickey_zhouyou.database.domain.BaseEntity;
import net.yeah.mickey_zhouyou.database.domain.BaseRelationship;
import net.yeah.mickey_zhouyou.database.file_manage.FileManager;
import net.yeah.mickey_zhouyou.database.status.DBStatus;
import net.yeah.mickey_zhouyou.database.util.ClassFieldsCache;

/**
 * 数据库用户接口。 数据库外部只通过此类访问数据库。
 * 
 * @author Mickey
 * 
 */
public final class DBUI {

	private DBUI() {
		throw new UnsupportedOperationException();
	}

	/**
	 * 初始化数据库。 必须先执行这一操作初始化数据库，否则与数据库有关的任何操作都不可以进行。
	 */
	public static void init() {
		DBStatus.changeStatus();
		FileManager.loadDataToCache();
		EntityCache.clearInvalidEntity();
		DBStatus.changeStatus();
	}

	/**
	 * 保存一个实体
	 * 
	 * @param e
	 */
	public static <E extends BaseEntity> void save(E e) {
		FileManager.save(e);
		EntityCache.addEntity(e);
	}

	public static <E extends BaseEntity> void delete(Class<E> clazz, long id) {
		E e = load(clazz, id);
		if (e != null) {
			FileManager.delete(e);
			EntityCache.remove(clazz, e.getId());
		}
	}

	/**
	 * 读取一个实体对象
	 * 
	 * @param clazz
	 * @param id
	 * @return
	 */
	public static <E extends BaseEntity> E load(Class<E> clazz, long id) {
		return EntityCache.loadById(clazz, id);
	}

	/**
	 * 按一个属性读取一组数据
	 * 
	 * @param clazz
	 *            实体类型
	 * @param propertyName
	 *            属性名（此属性必须支持用==或用equals方法比较相等）
	 * @param value
	 *            属性值
	 * @return
	 */
	public static <E extends BaseEntity> Collection<E> load(Class<E> clazz,
			String propertyName, Object value) {
		Collection<E> all = EntityCache.loadAll(clazz);
		Collection<E> res = new ArrayList<E>();
		for (E entity : all) {
			Object val = ClassFieldsCache.getValue(entity, propertyName);
			if (value == val)
				res.add(entity);
			else if (value != null && val != null && value.equals(val))
				res.add(entity);
		}
		return res;
	}

	public static <R extends BaseRelationship<?, ?>> void save(R r) {
		FileManager.save(r);
	}

	public static <E extends BaseEntity> Collection<E> loadAll(Class<E> clazz) {
		return EntityCache.loadAll(clazz);
	}

}
